package cn.wolfcode.trip.app.web.controller;

import cn.wolfcode.trip.base.domain.Sign;
import cn.wolfcode.trip.base.service.ISignService;
import cn.wolfcode.trip.base.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author by mycp
 * @Classname SignController
 * @Description TODO 签到处理器
 * @Date 2018/11/13 21:42
 */
@RestController
@RequestMapping("/signs")
public class SignController {
    @Autowired
    private ISignService signService;

    /**
     * 用户当天签到接口
     * 接口: /signs/{userId}/singToday
     * 参数: userId = xx
     */
    @GetMapping("/{userId}/signToday")
    public Object singToday(@PathVariable Long userId){

        JsonResult jsonResult = new JsonResult();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date today = new Date();
        // 判断用户是否是第一次签到
        Sign userSign = signService.getSignByUserId(userId);
        if (userSign == null) {
            Sign sign = new Sign();
            // 设置用户
            sign.setUserId(userId);
            // 设置签到时间
            sign.setSignTime(today);
            // 设置第一次签到的积分
            sign.setSignPoints(10L);
            // 设置签到次数
            sign.setSignCount(1);
            // 第一次签到则插入一条用户签到信息
            signService.saveSign(sign);
            jsonResult.setData(sign);
        } else {

            // 不是第一次签到则更新用户签到信息
            Date signTime = userSign.getSignTime();
            String format = sdf.format(signTime);
            String todayFormat = sdf.format(today);
            try {
                signTime = sdf.parse(format);
                today = sdf.parse(todayFormat);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            // 判断是否当天连续签到
            if (signTime.compareTo(today) == 0){
                // 当天连续签到, 返回提示信息
                jsonResult.mark("亲, 您今天已经签到过了!");
                jsonResult.setData(userSign);
                return jsonResult;
            }

            // 重新设置更新时间
            userSign.setSignTime(today);
            // 如果不是当前连续签到, 先判断是否是连续签到
            // 对签到时间进行处理
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(signTime);
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            signTime = calendar.getTime();

            /**
             * 判断连个日期的前后, 返回 整数, 说明大于, 返回0, 说明相等, 返回负数, 说明小于
             */
            int i = signTime.compareTo(today);
            // 获取连续签到的次数
            int signCOunt = userSign.getSignCount();
            // 获取用户的积分
            Long signPoints = userSign.getSignPoints();
            if (i == 0){
                // 连续签到
                // 如果当前连续签到次数为2, 则说明本次签到已经到达了连续签到三天的条件, 可以领取礼品
                if (signCOunt == 2){
                    // 重新当前设置签到次数
                    userSign.setSignCount(signCOunt + 1);

                    // 连续签到3天, 则多加1积分
                    userSign.setSignPoints(signPoints + 20);

                } else if (signCOunt == 3){
                    // 如果当前连续签到次数为3, 则说明达到连续签到领取奖品的上限, 将连续签到的次数重新设置为1
                    userSign.setSignCount(1);
                    userSign.setSignPoints(signPoints + 10);
                } else {
                    // 连续签到1 天, 2天
                    userSign.setSignCount(signCOunt + 1);
                    userSign.setSignPoints(signPoints + 10);
                }
            } else {
                // 不是连续签到
                userSign.setSignCount(1);
                userSign.setSignPoints(signPoints + 10);
            }

            // 更新用户的签到
            userSign.setSignTime(new Date());
            signService.updateSignByUserId(userSign);
            // 重新查询出用户签到信息, 设置到返回数据中
            jsonResult.setData(signService.getSignByUserId(userId));
        }

        return jsonResult;
    }


    /**
     * 获取用户的积分
     * 接口: /signs/{userId}/credits
     * 参数: userId = xx
     */
    @GetMapping("/{userId}/credits")
    public Object getCreditsByUserId(@PathVariable Long userId){
        JsonResult jsonResult = new JsonResult();
        Sign sign = signService.getCreditsByUserId(userId);
        if (sign == null){
            jsonResult.mark("当前用户没有积分");
        } else {
            jsonResult.setData(sign);
        }
        return jsonResult;
    }
}
